var isIE = navigator.userAgent.toLowerCase().indexOf("msie") != -1;
var isIE6 = navigator.userAgent.toLowerCase().indexOf("msie 6.0") != -1;
var isGecko = navigator.userAgent.toLowerCase().indexOf("gecko") != -1;
var isQuirks = document.compatMode == "BackCompat";

if (window.HTMLElement) {// 给FF添加IE专有的属性和方法
	HTMLElement.prototype.__defineGetter__("parentElement", function() {
		if (this.parentNode == this.ownerDocument)
			return null;
		return this.parentNode;
	});
	HTMLElement.prototype.__defineSetter__("outerHTML", function(sHTML) {
		var r = this.ownerDocument.createRange();
		r.setStartBefore(this);
		var df = r.createContextualFragment(sHTML);
		this.parentNode.replaceChild(df, this);
		return sHTML;
	});
	HTMLElement.prototype.__defineGetter__("outerHTML", function() {
		var attr;
		var attrs = this.attributes;
		var str = "<" + this.tagName;
		for ( var i = 0; i < attrs.length; i++) {
			attr = attrs[i];
			if (attr.specified)
				str += " " + attr.name + '="' + attr.value + '"';
		}
		if (!this.canHaveChildren)
			return str + ">";
		return str + ">" + this.innerHTML + "</" + this.tagName + ">";
	});
	HTMLElement.prototype.__defineSetter__("innerText", function(sText) {
		var parsedText = document.createTextNode(sText);
		this.innerHTML = parsedText;
		return parsedText;
	});
	HTMLElement.prototype.__defineGetter__("innerText", function() {
		var r = this.ownerDocument.createRange();
		r.selectNodeContents(this);
		return r.toString();
	});
}

Array.prototype.toString = function() {
	var json = [], len = this.length;
	for ( var i = 0; i < len; i++) {
		json.push(Object.f(this[i]))
	}
	return "[" + json.join(",") + "]";
}
Array.prototype.indexOf = function(item) {
	for ( var i = 0; i < this.length; i++)
		if (this[i] == item)
			return i;
	return -1;
}

/**
 * 在字符串两边加上双引号“"” 如："sssss".quote()返回结果为"\"sssss\""
 * 
 * @author chenxiang
 */
String.prototype.quote = function() {
	var escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, meta = { // table
		// of
		// character
		// substitutions
		'\b' : '\\b',
		'\t' : '\\t',
		'\n' : '\\n',
		'\f' : '\\f',
		'\r' : '\\r',
		'"' : '\\"',
		'\\' : '\\\\'
	};
	var string = this.valueOf()
	escapable.lastIndex = 0;
	return escapable.test(string) ? '"' + string.replace(escapable, function(a) {
		var c = meta[a];
		return typeof c === 'string' ? c : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
	}) + '"' : '"' + string + '"';
}
/**
 * 格式化日期显示的格式化表示式
 * 
 * @param format
 *            -格式化字符串，默认为（yyyy-MM-dd hh:mm:ss），可选值如下：
 *            y+:表示年，如：yyyy表示取年的4位数字，yyy表示取年的后3位数字，yy表示取年的后2位数字，y表示取年的后1位数据；
 *            M+:表示月，如：M取当前月的值，小于10的数据前边不会自动加0，MM表示取月的时候，小于10的数据会在前边加0，下边带有+号的与此相同；
 *            d+:表示日； h+:表示小时； m+:表示分钟； s+:表示秒； S:表示毫秒； q:表示季； D:表示一年中的第几天；
 *            W:表示一年中的第几周； w:表示今天是星期几。
 * @author chenxiang
 */
Date.prototype.format = "yyyy-MM-dd hh:mm:ss";
/**
 * 格式化日期显示
 * 
 * @param format
 *            -格式化字符串，可选值如下：
 *            y+:表示年，如：yyyy表示取年的4位数字，yyy表示取年的后3位数字，yy表示取年的后2位数字，y表示取年的后1位数据；
 *            M+:表示月，如：M取当前月的值，小于10的数据前边不会自动加0，MM表示取月的时候，小于10的数据会在前边加0，下边带有+号的与此相同；
 *            d+:表示日； h+:表示小时； m+:表示分钟； s+:表示秒； S:表示毫秒； q:表示季； D:表示一年中的第几天；
 *            W:表示一年中的第几周； w:表示今天是星期几。
 * @author chenxiang
 */
Date.prototype.toString = function(format) // author: meizz
{
	format = format || this.format;

	var o = {
		"M+" : this.getMonth() + 1, // month
		"d+" : this.getDate(), // day
		"h+" : this.getHours(), // hour
		"m+" : this.getMinutes(), // minute
		"s+" : this.getSeconds(), // second
		"q" : Math.floor((this.getMonth() + 3) / 3), // quarter
		"S" : this.getMilliseconds(), // millisecond
		"D" : Math.ceil((this - new Date(this.getYear(), 0, 1)) / (24 * 60 * 60 * 1000)), // days
		"W" : Math.ceil((this - new Date(this.getYear(), 0, 1)) / (24 * 60 * 60 * 1000) / 7), // week
		"w" : this.getDay()
	// 星期几
	}

	if (/(y+)/.test(format))
		format = format.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
	for ( var k in o)
		if (new RegExp("(" + k + ")").test(format))
			format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length));
	return format;
}

Number.prototype.format = function(format) {
	if (!format)
		return this;
	format = format.replace(/[a-z0-9]/ig, "#");
	var l = 0, r = 0, sp = ",", tmp = 0, arr = format.split("");
	for ( var i = arr.length - 1; i >= 0; i--) {
		if (arr[i] == ".") {
			r = tmp;
			tmp = 0;
			continue;
		}

		if (arr[i] != "#") {
			sp = arr[i];
			l = tmp;
			tmp = 0;
			break;
		}

		tmp++;
	}

	var ls = "", lsNum = 0, rs = r>0?"."+"000000000000000000000000".substr(0,r):"", rsNum = 0, arrNum = ("" + this).split(".");
	if (arrNum.length > 1) {
		rsNum = r == 0 ? parseFloat("." + arrNum[1]) : parseFloat("." + arrNum[i]).toFixed(r);
		rs = ("" + rsNum).substr(1);
	}

	lsNum = parseInt(arrNum[0]) + parseInt(rsNum);
	arrNum[0] = "" + lsNum;
	if (l == 0) {
		ls = arrNum[0];
	} else {
		var arrL = arrNum[0].split("");
		for ( var i = 0; i < arrL.length; i++) {
			ls += arrL[i];
			if ((arrL.length - i - 1) % l == 0 && i < arrL.length - 1)
				ls += sp;
		}
	}

	return ls + rs;
}

Object.f = function(o) {
	if (o == null)
		return '""';
	var type = typeof (o);
	if (o instanceof String || type == "string")
		return o.quote();
	if (o instanceof Boolean || o instanceof Number || type == "boolean" || type == "number")
		return o.valueOf();
	if (o == undefined)
		return "undefined";
	if (o instanceof Function)
		return "function";
	if (o instanceof Date)
		return o.toString().quote();
	if (o instanceof Object || type == "object")
		return o.toString();
}

/**
 * 把Object对应转成JSON字符串，此方法将会自动过虑掉function函数。
 * 
 * @author chenxiang
 */
/*
 * Object.prototype.toString=function(){ var $this = this;
 * if(this.tagName||this.fn) return "[object]"; if(this instanceof Array||(this
 * instanceof Object && this.length!=undefined)){ var json=[]; for(var
 * i=0,l=this.length;i<l;i++){ json.push(Object.f(this[i])) } return
 * "["+json.join(",")+"]"; }else{ var json=[]; for(var k in this){
 * if(typeof(this[k])=="function") continue;
 * json.push('"'+k+'"'+":"+Object.f(this[k])) } return "{"+json.join(",")+"}"; } }
 */
String.prototype.encodeHTML = function() {
	return this.replace(/[<>\"\s]/g, function(c) {
		return {
			'<' : '&lt;',
			'>' : '&gt;',
			'"' : '&quot;',
			' ' : '&nbsp;'
		}[c]
	});
}
String.prototype.bind = function(data, encodeHTML) {
	$this = this.replace(/%7(B|D)/g, function(c) {
		return {
			'%7B' : '{',
			'%7D' : '}'
		}[c]
	});
	return $this.replace(/\${(.)*?}/g, function($1) {
		try {
			var val = eval("(data." + $1.replace(/[\${}]+/g, "") + ")");
			return val === null ? "" : val === undefined ? $1 : encodeHTML == true && typeof (val) == "string" ? val.encodeHTML() : val;
		} catch (e) {
			return $1;
		}
	}).replace(/value= +name=/g, 'value="" name=').bindCode();
}
String.prototype.bindCode = function() {
	return this.replace(/code=\"(.)*?\"/g, function($1) {
		try {
			var val = eval("(new Function(\"" + $1.replace(/code=\"|\"+/g, "") + "\").call())");
			return val == null ? "" : val;
		} catch (e) {
			return $1 + e.name;
		}
	});
}

/**
 * 选择TAB
 */
$.chooseTab = function(obj) {
	if ($(obj).parent().hasClass("current"))
		return;
	var container = $(obj).parents(".tab");
	if (!container || container.length == 0)
		return;

	$(">div.title li.current", container).removeClass("current");
	$(obj).parent().addClass("current");

	var itemId = $(obj).attr("item_id");
	var container = $(">div.content", container);
	var itemContent = $(">div[item_id=" + itemId + "]", container);
	if (itemContent.length > 0) {
		container.children().hide();
		itemContent.show();
	} else {
		container.children().hide();
		container.append("<div item_id=" + itemId + ">" + obj.innerHTML + "</div>");
		// $("<div
		// item_id="+itemId+">"+obj.innerHTML+"</div>").appendTo(container);
	}

	$.autoHeight(obj.document ? obj.document.parentWindow.window : window);
}

/**
 * 根据参数名称获取参数值 eg:?p1=123&p2=456 当name为p1时返回123，为p2时返回456
 * 
 * @param name
 *            参数名称，不区分大小写
 * @return 返回参数名称对应的值
 * @author chenxiang
 */
$.getParam = function(name, href) {
	href = href || location;
	var r = (href.search + href.hash).match(new RegExp("[\?\&\#]" + name + "=([^\&|\#]*)(\&|\#?)", "i"));
	return r ? unescape(r[1]) : null;
}

/**
 * Iframe自适应 调用方式，在需要做自适应的Iframe中增加下边这句代码： onload="$.autoHeight(this)"
 * 
 * @param Iframe对象
 * @author chenxiang
 */
$.autoHeight = function(frm) {
	if (typeof (frm) == "string")
		frm = $("#" + frm)[0];
	if (!frm || frm.name == "_DialogFrame" || (!frm.src && frm.tagName && frm.tagName.toLowerCase() == "iframe"))
		return;
	if ($.browser.msie) {
		var setHeight = function(frm) {
			var win = frm.tagName ? frm.contentWindow : frm, p = window == win ? win.parent : window;
			var frames = p.frames, frame, i = 0;
			while (frame = frames[i++]) {
				if (frame.frameElement.contentWindow == win) {
					frame.frameElement.height = frame.frameElement.contentWindow.document.body.scrollHeight;
					if (frame.parent.parent != frame.parent)
						frame.parent.parent.$.autoHeight(frame.parent);
					break;
				}
			}
			// if(window.parent!=window){window.parent.$.autoHeight(window)}
		}
		var time = setTimeout(function() {
			clearTimeout(time);
			setHeight(frm);
		}, 0);
	} else {
		if (!frm.contentWindow) {
			var frame, i = 0;
			while (frame = window.frames[i++]) {
				if (frm == frame.frameElement.contentWindow) {
					frm = frame.frameElement;
					break;
				}
			}
		}
		if (frm.contentWindow)
			frm.height = frm.contentWindow.document.body.offsetHeight;
	}
}
